package fr.lip6.move.care

import sdmakerz_v1.coresyntax.generator.interfaces.IContext
import sdmakerz_v1.coresyntax.generator.SDMakerV1IDProvider
import sdmakerz_v1.coresyntax.SDMakerV1Utils
import sdmakerz_v1.coresyntax.sDMakerV1.Diagram
import sdmakerz_v1.coresyntax.generator.interfaces.IInterfaceData
import java.util.ArrayList
import sdmakerz_v1.coresyntax.sDMakerV1.Obj
import java.util.List

class CareDiagramGen {
	private CareGen mainGenerator;
	
	new(CareGen mainGenerator){
		this.mainGenerator= mainGenerator;
	}
	
	def public 
	CompileResult compile(IContext context, Diagram diagram){
		var List<IInterfaceData> usedClass= 
			new ArrayList<IInterfaceData>();
        var List<CompileResult> compileResults= 
        	new ArrayList<CompileResult>();
        
        for(elt : diagram.diagram_elts){
        	
        	if(elt instanceof Obj){
        		var Obj obj = elt as Obj;
        		var IInterfaceData iid= 
        			context.getInterfaceDataByName(obj.type.identifier);
        		if(SDMakerV1Utils::contains(usedClass, iid)==false){
        			usedClass.add(iid);
        		}
        	}
        	
        	var CompileResult compRes = mainGenerator.compile(context, elt);
        	
        	if(compRes.isAddableToEntryPoint){
        		mainGenerator.addToMainSequence(compRes);
        	}
        	compileResults.add(compRes);
        }
        
        var CharSequence charSequenceResult= 
        '''
        package programs;
        
        import java.util.ArrayList;
        import program.*;
        import traces.*;
        «context.getConfigData.printImports»
            
        public class «SDMakerV1Utils::computeSimpleName(context.inputData.outputBasedName.replaceAll("/","\\."))»_«diagram.name» {     
            public static Main create(){
                int i= 0;
                ArrayList<Actor> actors= new ArrayList<Actor>();
                
                ObjectClass actorClass=new ObjectClass("Actor");
                «FOR IInterfaceData interfaceDatas: usedClass»
                ObjectClass «interfaceDatas.interfaceID»= new ObjectClass("«interfaceDatas.getQualifiedName»");
                «ENDFOR»
                
                «FOR compRes: compileResults»
                    «compRes.charSequenceResult»
                «ENDFOR»
                
                «var String mainID= "entry_point_id"+SDMakerV1IDProvider::computeID»
                ArrayList<Block> «mainID» = new ArrayList<Block>();
                «FOR elt: mainGenerator.mainSequence»
                «mainID».add(«elt.eltID»);
                «ENDFOR»
                return new Main(«mainID», actors, 200);
            } 
        
            public static void main(String[] args) {
                Main sd=create();
                boolean ok=sd.saveModel("«context.getDiagramRefData.diagNewName»");
                if (ok){
                    sd.genereAllTraces("«context.getDiagramRefData.diagNewName»", 100);
                }
                
                
    	        «context.getConfigData.printEval»
            }
        }
        '''

        return new CompileResult(
    				charSequenceResult,
    				null,
    				true)
	}
}